4   '   ******************************************

6   '   *** (DFT4.1) GENERATE/ANALYZE WAVEFORM ***

8   '   ******************************************

10 GOSUB 1000

11   ' *** DEFINE CONSTANTS

12 PI = 3.141592653589793#: P2 = 2 * PI: K1 = PI / 8: K2 = 1 / PI

13   ' *** DIMENSION ARRAYS

14 DIM Y(16), FC(16), FS(16), KC(16), KS(16), Z(16)

15   ' *** INITIALIZE FOURIER COEFFICIENT ARRAYS

16 CLS : FOR J = 0 TO 16: FC(J) = 0: FS(J) = 0: NEXT

20 GOSUB 108:   ' - PRINT COLUMN HEADINGS

30 GOSUB 120:   ' - GENERATE FUNCTION Y(X)

40 GOSUB 200:   ' - PERFORM DFT

60 GOSUB 140:   ' - PRINT OUT FINAL VALUES

69   ' *** ASK IF RECONSTRUCTION IS NECESSARY

70 PRINT : PRINT "RECONSTRUCT (Y/N)? ";

72 A$ = INKEY$: IF A$ = "" THEN 72

74 PRINT A$: IF A$ = "Y" THEN 80

76 GOTO 300

80 CLS : GOSUB 220:   ' * RECONSTRUCT

82 GOSUB 240:   ' * PRINT OUTPUT

84 PRINT : PRINT "ANY KEY TO CONTINUE"

86 A$ = INKEY$: IF A$ = "" THEN 86

88 PRINT A$

90 GOTO 300

100   '  ******************************************

102   '  *         PROGRAM SUBROUTINES            *

104   '  ******************************************

106   '  *       PRINT COLUMN HEADINGS            *

108 PRINT : PRINT

109   ' *** Y(COS) AND Y(SIN)=INPUT COMPONENT AMPLITUDES

110 PRINT "FREQ    F(COS)      F(SIN)      Y(COS)      Y(SIN)"

112 PRINT

114 RETURN

118   ' ******************************

120   ' *** GENERATE FUNCTION F(X) ***

122 FOR I = 0 TO 15: K3 = I * K1:   ' I=DATA POINT LOCATION IN ARRAY

123   ' *** SET Y(I)=FIRST 8 COMPONENTS OF TRIANGLE WAVE

124 Y(I) = COS(K3) + COS(3 * K3) / (9) + COS(5 * K3) / (25) + COS(7 * K3) / 49

126 NEXT

127   ' *** STORE COMPONENT AMPLITUDES

128 FOR I = 1 TO 7 STEP 2: KC(I) = 1 / I ^ 2: NEXT

130 RETURN

132   ' ******************************

138   ' *       PRINT OUTPUT         *

140 FOR Z = 0 TO 15

142 PRINT Z; "    "; :   ' * Z=COMPONENT FREQUENCY

144 PRINT USING "##.#####_    "; FC(Z); FS(Z); KC(Z); KS(Z)

146 NEXT Z

148 RETURN

200   ' **************************

202   ' *  SOLVE FOR COMPONENTS  *

204   ' **************************

206 FOR J = 0 TO 15:   ' SOLVE EQNS FOR EACH FREQUENCY

208 FOR I = 0 TO 15:   ' MULTIPLY AND SUM EACH DATA POINT

210 FC(J) = FC(J) + Y(I) * COS(J * I * K1): FS(J) = FS(J) + Y(I) * SIN(J * I * K1)

212 NEXT I

214 FC(J) = FC(J) / 16: FS(J) = FS(J) / 16:   ' FIND MEAN VALUE

216 NEXT J

218 RETURN

   ' **************************

   ' *       RECONSTRUCT      *

   ' **************************

220 FOR I = 0 TO 16: Z(I) = 0: NEXT I

226 FOR J = 0 TO 15:   ' RECONSTRUCT EACH FREQUENCY

228 FOR I = 0 TO 15:   ' RECONSTRUCT EACH DATA POINT

230 Z(I) = Z(I) + FC(J) * COS(J * I * K1) + FS(J) * SIN(J * I * K1)

232 NEXT I

234 NEXT J

236 RETURN

240   ' ******************************

242   ' *       PRINT OUTPUT         *

243   ' * Y(I) EQUALS INPUT FUNCTION FOR COMPARISON

244 CLS : PRINT : PRINT "T        Z(I)        Y(I)": PRINT : PRINT

245 FOR Z = 0 TO 15

246 PRINT Z; "    ";

248 PRINT USING "##.#####_    "; Z(Z); Y(Z)

250 NEXT Z

252 RETURN



300 '  *******  DATA DISPLAY  *******

310 CLS : FOR J = 0 TO 16: FC(J) = 0: FS(J) = 0: NEXT

330 GOSUB 120 ' GENERATE FUNCTION Y(X)

332 GOSUB 500 ' PLOT DATA

340 GOSUB 200 ' - PERFORM DFT

360 GOSUB 550 ' - PLOT FINAL VALUES

362 GOSUB 220 ' RECONSTRUCT TIME DOMAIN

364 GOSUB 650 ' PLOT RECONSTRUCTED DATA

370 PRINT : PRINT "MORE (Y/N)? ";

372 A$ = INKEY$: IF A$ = "" THEN 372

374 PRINT A$: IF A$ = "Y" THEN 16

380 END



500 ' ***  PLOT DATA  ***

502 SCREEN 9, 1, 1, 1: COLOR 15, 1: CLS

504 LINE (10, 10)-(10, 360)

506 LINE (600, 180)-(10, 180)

510 FOR I = 0 TO 15

512 LINE (37.5 * I + 11, 179 - 50 * Y(I))-(37.5 * I + 11, 179 - 50 * Y(I))

514 NEXT I

516 LOCATE 18, 30: PRINT "TIME DOMAIN WAVEFORM"

518 INPUT "ENTER TO CONTINUE"; A$

549 RETURN



550 ' ***  PLOT DATA  ***

552 SCREEN 9, 1, 1: COLOR 15, 1: CLS

554 LINE (10, 10)-(10, 360)

556 LINE (600, 150)-(10, 150)

560 FOR I = 0 TO 15: Y(I) = SQR(FC(I) ^ 2 + FS(I) ^ 2)

562 LINE (37.5 * I + 11, 150 - 50 * Y(I))-(37.5 * I + 11, 150 - 50 * Y(I))

564 NEXT I

566 LINE (600, 250)-(10, 250)

570 FOR I = 0 TO 15: Y(I) = SQR(KC(I) ^ 2 + KS(I) ^ 2)

572 LINE (37.5 * I + 11, 250 - 50 * Y(I))-(37.5 * I + 11, 250 - 50 * Y(I))

574 NEXT I

576 LOCATE 4, 30: PRINT "TRANSFORM OF DATA"

578 LOCATE 18, 8: PRINT "COMPONENTS USED TO GENERATE INPUT"

580 PRINT

582 INPUT "ENTER TO CONTINUE"; A$

599 RETURN



650 ' ***  PLOT DATA  ***

652 SCREEN 9, 1, 1: COLOR 15, 1: CLS

654 LINE (10, 10)-(10, 360)

656 LINE (600, 180)-(10, 180)

660 FOR I = 0 TO 15

662 LINE (37.5 * I + 11, 179 - 50 * Z(I))-(37.5 * I + 11, 179 - 50 * Z(I))

664 NEXT I

676 LOCATE 4, 30: PRINT "RECONSTRUCTED DATA"

680 LOCATE 18, 10

682 INPUT "ENTER TO CONTINUE"; A$

699 RETURN





998  ' *****   TEST INFORMATION   *****

1000 SCREEN 9, 1, 1: COLOR 15, 1: CLS : PRINT : PRINT

1002 PRINT SPC(5); "THIS DFT PROGRAM CAN TRANSFORM AND ALSO RECONSTRUCT "

1004 PRINT SPC(5); "THE ORIGINAL TIME DOMAIN FUNCTION.  THE PROGRAM THEN"

1012 PRINT SPC(5); "PROVIDES A PLOT OF THE INPUT DATA AND ALSO PLOTS OF "

1014 PRINT SPC(5); "THE TRANSFORM.  THE RECONSTRUCTED DATA MAY ALSO BE PLOTTED."

1016 PRINT SPC(5); " ": PRINT

1022 INPUT "ENTER TO CONTINUE"; A$

1030 RETURN



